linux 虚拟机无法访问网络的几个常见问题
在使用虚拟机的时候常常会遇到访问不了互联网的问题,搞来搞去发现问题多出在几个固定的地方,主要是 nameserver 与默认网关配置问题,本文主要针对这些常见的问题点进行描述。
nameserver 配置问题导致域名无法解析
问题的具体现象如下:
[longyu@debian-10:15:17:20] ~ $ ping www.baidu.com
ping: www.baidu.com: Name or service not known
上面的报错信息表明,www.baidu.com 这个域名无法解析找到对应的 ip 地址,ping 失败。
这时我们需要检查 /etc/resolv.conf
文件。
正常的 /etc/resolv.conf
文件内容的一个示例如下:
# Generated by NetworkManager
nameserver x.x.x.x
nameserver + ip 地址就是其中的一项,这里的 x.x.x.x 是 dns 服务器的地址。有了这个配置,当我们访问某个域名的时候就会从这个 dns 服务器上去获取域名对应的公网 ip。
缺少默认网关配置的问题
一个更常见的问题是机器中缺少默认网关配置。这里提到的默认网关是我们的机器与外界联系的第一道桥梁,本地机器上发送给其它网段的包由默认网关转发到外界。
对于缺少默认网关配置的问题,我们可以通过执行 route
命令来添加一个默认网关。
route 命令的执行示例
在我的虚拟机中,执行 route
命令有如下输出信息:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 0 0 0 ens8
default _gateway 0.0.0.0 UG 100 0 0 ens3
default _gateway 0.0.0.0 UG 102 0 0 ens9
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 ens3
192.168.122.0 0.0.0.0 255.255.255.0 U 100 0 0 ens3
192.168.122.0 0.0.0.0 255.255.255.0 U 101 0 0 ens8
192.168.122.0 0.0.0.0 255.255.255.0 U 102 0 0 ens9
这里的 0.0.0.0 表示本地机器上的所有 ip 地址。Destination 为 default 的项目就是默认网关的路由配置信息。
下面我使用 ens8 这个接口来演示如何删除、添加路由信息。
删除一条路由信息
使用 route
命令删除路由信息使用的参数如下:
route [-v] [-A family |-4|-6] del [-net|-host] target [gw Gw] [netmask Nm] [metric M] [[dev] If]
删除一条默认路由可以执行 route del default [[dev] If]
命令。机器上有多个网络端口的情况下,可以通过指定 dev 参数来删除指定端口的默认路由配置。
这里我执行如下命令删除我的虚拟机中 ens8 端口的默认路由信息:
longyu@longyu-pc:~$ sudo route del default ens8
执行成功后,执行 route 命令查询系统中目前的路由表信息如下:
longyu@longyu-pc:~$ sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 100 0 0 ens3
default _gateway 0.0.0.0 UG 102 0 0 ens9
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 ens3
192.168.122.0 0.0.0.0 255.255.255.0 U 100 0 0 ens3
192.168.122.0 0.0.0.0 255.255.255.0 U 101 0 0 ens8
192.168.122.0 0.0.0.0 255.255.255.0 U 102 0 0 ens9
通过上面的信息可以看到 ens8 的默认路由已经被移除。这时候我们使用 ens8 端口来 ping 百度是 ping 不通的,测试输出如下:
longyu@longyu-pc:~$ ping -I ens8 www.baidu.com
PING www.wshifen.com (104.193.88.77) from 192.168.122.202 ens8: 56(84) bytes of data.
^C
--- www.wshifen.com ping statistics ---
12 packets transmitted, 0 received, 100% packet loss, time 274ms
添加一个默认网关的路由信息
在上面的操作中,我们已经删除了 ens8 端口的默认路由配置,这导致我们无法通过 ens8 端口来访问互联网。要恢复正常,我们可以将删除的默认路由添加回来。
route
命令添加路由可以通过指定如下参数来完成。
route [-v] [-A family |-4|-6] add [-net|-host] target [netmask Nm] [gw Gw] [metric N] [mss M] [window W] [irtt I] [reject] [mod] [dyn] [reinstate] [[dev] If]
给 ens8 端口添加默认路由通过执行如下命令来完成。
longyu@longyu-pc:~$ sudo route add default gw 192.168.122.1 ens8
这里需要注意的是在将 192.168.122.1 设置为默认网关之前,要确保 192.168.122.1 能够被访问到。添加成功后再次执行 route
命令有如下输出:
longyu@longyu-pc:~$ sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 0 0 0 ens8
default _gateway 0.0.0.0 UG 100 0 0 ens3
default _gateway 0.0.0.0 UG 101 0 0 ens8
default _gateway 0.0.0.0 UG 102 0 0 ens9
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 ens3
192.168.122.0 0.0.0.0 255.255.255.0 U 100 0 0 ens3
192.168.122.0 0.0.0.0 255.255.255.0 U 101 0 0 ens8
192.168.122.0 0.0.0.0 255.255.255.0 U 102 0 0 ens9
可以看到,默认网关的路由信息已经添加了回来,再次通过 ens8 ping 百度有如下输出:
longyu@longyu-pc:~$ ping -I ens8 www.baidu.com
PING www.wshifen.com (104.193.88.123) from 192.168.122.202 ens8: 56(84) bytes of data.
64 bytes from 104.193.88.123 (104.193.88.123): icmp_seq=1 ttl=45 time=267 ms
64 bytes from 104.193.88.123 (104.193.88.123): icmp_seq=2 ttl=45 time=267 ms
64 bytes from 104.193.88.123 (104.193.88.123): icmp_seq=3 ttl=45 time=270 ms
^C
--- www.wshifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 5ms
rtt min/avg/max/mdev = 266.688/268.135/270.384/1.666 ms
从上面的信息可以看到,我们已经可以通过 ens8 端口访问到互联网了。
openEuler 系统安装后无法访问互联网
前段时间安装了 openEuler 系统后发现无法访问互联网,排查了 dns 与默认网关都是正常的。
关闭 selinux、防火墙之后重试仍旧有相同的问题。最后发现需要修改 /etc/sysconfig/network-scripts/ifcfg-xxx 中的接口配置,将 ONBOOT=no 修改为 ONBOOT=yes 即可解决问题。
排查网络接口驱动侧问题的一般思路
也曾经遇到过网络接口驱动问题导致无法访问网络的情况,遇到这种问题一般可以查看以下几个点的信息:
- ifconfig xxx 查看接口是否 RUNNING 且收发包统计是否正常
- ethtool xxx 查看接口 Link detected 是否为 yes
- ethtool -S xxx 查看接口收发包统计是否正常及是否有异常统计增加
- 查看 dmesg 信息观察是否有相关的 oops 信息
- 对于 pci 网卡,使用 lspci 命令排查是否硬件故障
常见问题的恢复可以参考如下步骤:
- 执行一次接口 down、up
- 解绑驱动后重新绑定网卡接口
- 重启机器